package org.meetunexpectedly.service.user;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.meetunexpectedly.entity.video.Type;
import org.meetunexpectedly.entity.vo.*;
import org.meetunexpectedly.entity.user.User;

import java.util.Collection;

/**
 * @Description: 用户服务类
 * @Author: pupil
 * @Date: 2024/08/03 下午 10:00
 */
public interface UserService extends IService<User> {

    /**
     * 用户注册
     * @param registerVO
     * @return
     */
    Boolean register(RegisterVO registerVO) throws Exception;

    /**
     * 用户密码重置
     * @param forgotPwdVO
     * @return
     */
    Boolean ResetPassword(ForgotPwdVO forgotPwdVO);

    /**
     * 获取用户信息
     * @param userId
     * @return
     */
    UserVO getInfo(Long userId);

    /**
     * 获取粉丝
     * @param basePage 基础分页信息
     * @param userId 用户id
     * @return
     */
    Page<User> getFans(BasePage basePage, Long userId);

    /**
     * 获取关注人员
     * @param basePage 基础分页信息
     * @param userId 用户id
     * @return
     */
    Page<User> getFollows(BasePage basePage, Long userId);

    /**
     * 关注/取关
     * @param followsUserId 关注人员id
     * @return
     */
    Boolean follows(Long followsUserId);

    /**
     * 修改用户模型
     * @param userModel
     */
    void updateUserModel(UserModel userModel);

    /**
     * 获取用户搜索记录
     * @param userId 用户id
     * @return
     */
    Collection<String> searchHistory(Long userId);

    /**
     * 设置用户搜索记录
     * @param userId
     * @param searchName
     * @return
     */
    Boolean setSearchHistory(Long userId, String searchName);

    /**
     * 删除用户搜索记录
     * @param userId
     * @return
     */
    Boolean deleteSearchHistory(Long userId);

    /**
     * 订阅分类/取消订阅
     * @param types
     * @return
     */
    String subscribe(String types);


    /**
     * 获取用户订阅的分类
     * @param userId
     * @return
     */
    Collection<Type> listSubscribeTypes(Long userId);

    /***
     * 获取用户未订阅的分类
     * @param userId
     * @return
     */
    Collection<Type> listNoSubscribeTypes(Long userId);

    /**
     * 修改用户信息
     * @param userVO 修改后的用户信息
     * @return
     */
    Boolean updateUser(UpdateUserVO userVO);

    /**
     * 分页获取用户列表
     * @param basePage 分页信息
     * @param name 昵称
     * @return
     */
    IPage<User> getUserListByPage(BasePage basePage, String name);

    /**
     * 删除用户
     * @param id
     * @return
     */
    Boolean deleteUser(Long id);
}
